package com.atiguigu.rabbitmq.five;

import com.atiguigu.rabbitmq.utils.RabbitMqUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
/*
* 以fanout交换机(所有队列使用一个rountingKey)做媒介：交换机绑定队列，生产者发送消息到指定交换机rountingKey绑定的队列
*              不同交换机绑定不同队列，每个队列可接受到同样的消息，实现消息多次消费（再一个队列中，消息只能被消费1次）
*
* */
public class ReceiveLog1 {
    public static final String EXCHANGE_NAME = "logs";
    public static void main(String[] args) throws IOException, TimeoutException {
       Channel channel = RabbitMqUtils.getChannel();
       //声明交换机名、扇出（fanout）类型
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
        //声明一个临时队列
        /*
        * 生成一个临时队列，队列名随机
        * 当队列与消费者断开连接时自动删除
        * */
        String  queueName = channel.queueDeclare().getQueue();
        /*
        * 绑定交换机和队列,通过第3个参数routingKey连接，参数1：队列和参数2：交换机
        * */
        channel.queueBind(queueName,EXCHANGE_NAME,"");
        System.out.println("等待接收消息，接收到消息打印在屏幕");
        DeliverCallback deliverCallback = (consumerTag, message)->{
            System.out.println("ReceiverLog2接收消息:"+new String(message.getBody()));
        };
        CancelCallback callback= consumerTag->{
            System.out.println(consumerTag+"消费者取消消费接口回调逻辑");
        };
        channel.basicConsume(queueName,true,deliverCallback,callback);
    }
}
